package 常用方法.字符串的不可变性.String类在设计时就是不可改变的;

import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-20
 * Time: 12:43
 */
/*
1. String类中的字符实际保存在内部维护的value字符数组中，该图还可以看出：
private final char value[];
- String类被final修饰，表明该类不能被继承
- value被final修饰，表明value自身的值不能发生改变，即不能引用其他字符数组，但是其他引用空间中的内容可以修改。
2. 所有涉及到可能修改字符串内容的操作都是创建一个新的对象，改变的是新对象

 */
public class Test {
    public static void main1(String[] args) {
        String str = "abc";
        System.out.println(str.replace("a", "qq"));
    }

    public static void main(String[] args) {
        final int[] array = {1, 2, 3, 4, 5};
        array[0] = 100;
        System.out.println(Arrays.toString(array));

        //编译报错：java: 无法为最终变量array分配值
        //array = new int[]{6, 7, 8};
    }
}

/*
【纠正】网上有些人说：字符串不可变是因为其内部保存字符的数组被final修饰了，因此不能改变。
这种说法是错误的，不是因为String类自身，或者其内部value被final修饰而不能被修改。

final修饰类表明该类不想被继承，final修饰引用类型表明该引用变量不能引用其他对象，但是其他引用对象中的内容是可以修改的。

 */

/*
为什么 String 要设计成不可变的?(不可变对象的好处是什么?) (选学)
1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了.
2. 不可变对象是线程安全的.
3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.
 */
